home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1996 October / MACPOWER-1996-10.ISO.7z / MACPOWER-1996-10.ISO / AMUG / Internet_31 / NetCacheResolver 0.9d6 / NetCacheResolver 0.9d6 ト / library / NCR_File.c < prev    next >
Text File  |  1996-05-12  |  7KB  |  303 lines

  1. // NetCache Resolver, 1995 (C) Mizutori Tetsuya
  2. // - NCR_File.c, October 8, 1995
  3. // This document is pretty printed in 10-point Geneva font.
  4.  
  5. #include "NCR_File.h"
  6. #include "NCR_Error.h"
  7.  
  8. // definition
  9. #define    kNilFilterProc    nil
  10.  
  11. // prototype
  12. //static void ErrorMessage ( long err, StringPtr string, Boolean fatal );
  13.  
  14. /***** Standard File Get & Put *****/
  15. Boolean GetFilename ( FSSpec *theFSSpec, short numTypes, SFTypeList typeList )
  16. {
  17.     StandardFileReply    reply;
  18. //    short                numTypes    = -1;    /* all types */
  19. //    OSType            typeList[] = {'TEXT', 'PICT', 0, 0};
  20.     OSErr            err;
  21.     
  22.     GestaltCheck( gestaltStandardFileAttr );
  23.  
  24.     StandardGetFile( kNilFilterProc, numTypes, typeList, &reply );
  25.  
  26.     if ( ! reply.sfGood ) return false;        // return by "Cancel"
  27.  
  28.     *theFSSpec = reply.sfFile;
  29.  
  30.     return true;                    // return by "Open"
  31. }
  32.  
  33.  
  34. Boolean PutFilename ( FSSpec *theFSSpec, StringPtr prompt, Boolean *replacing )
  35. {
  36.     StandardFileReply    reply;
  37. //    Str63            prompt = "¥p";
  38.     StringPtr            defaultName;
  39.     
  40.     GestaltCheck( gestaltStandardFileAttr );
  41.  
  42.     defaultName = theFSSpec->name;
  43.     
  44.     StandardPutFile( prompt, defaultName, &reply );
  45.  
  46.     if ( ! reply.sfGood ) return false;        // return by "Cancel"
  47.  
  48.     *replacing = reply.sfReplacing;
  49.     *theFSSpec = reply.sfFile;
  50.  
  51.     return true;                    // return by "Open"
  52. }
  53.  
  54.  
  55. OSErr ReadFile ( FSSpec *theFSSpec, FInfo *theFInfo, Handle h, long *size )
  56. {
  57.     short        fRefNum;
  58.     long        textSize;
  59.     OSErr    err;
  60.     
  61.     if ( h == nil ) return nilHandleErr;
  62.     
  63.     err = FSpGetFInfo( theFSSpec, theFInfo );
  64.     if ( err != noErr ) return err;
  65.  
  66.     err = FSpOpenDF( theFSSpec, fsRdPerm, &fRefNum );
  67.     if ( err != noErr ) return err;
  68.  
  69.     err = GetEOF( fRefNum, &textSize );
  70.     if ( err != noErr ) return err;
  71.  
  72. //    err = SetFPos( fRefNum, fsFromLEOF, 0 );
  73. //    if ( err != noErr ) return err;
  74.  
  75.     SetHandleSize( h, textSize );
  76.     if ( (err=MemError()) != noErr )
  77.         ErrorMessageMEM( err, true );
  78.  
  79.     HLock( h );
  80.     err = FSRead( fRefNum, &textSize, (Ptr) *h );
  81.     HUnlock( h );
  82.     
  83.     FSClose( fRefNum );
  84.  
  85.     if ( err != noErr ) return err;
  86.  
  87.     *size = textSize;
  88.     
  89.     return noErr;
  90. }
  91.  
  92.  
  93. OSErr WriteFile ( FSSpec *theFSSpec, FInfo *theFInfo, Handle h, long *size )
  94. {
  95.     OSType    fdType, fdCreator;
  96.     short        fRefNum;
  97.     long        fileID;
  98.     long        textSize;
  99.     OSErr    err;
  100.  
  101.     if ( h == nil ) return nilHandleErr;
  102.     
  103.     fdType    = theFInfo->fdType;
  104.     fdCreator    = theFInfo->fdCreator;
  105.     
  106. #ifdef COMMENT
  107.     #ifdef REPLACE_HINT
  108.         if ( ! replacing ) {
  109.     #else REPLACE_HINT
  110.         if ( !QueryFile ( theFSSpec, &fileID ) ) {
  111.     #endif REPLACE_HINT
  112.             err = FSpCreate( theFSSpec, fdCreator, fdType, smSystemScript );
  113.             if ( err != noErr ) return err;
  114.         }
  115. #endif /* COMMENT */
  116.  
  117.     err = FSpCreate( theFSSpec, fdCreator, fdType, smSystemScript );
  118.     if ( err != dupFNErr && err != noErr )  return err;
  119.  
  120.     err = FSpOpenDF( theFSSpec, fsRdWrPerm, &fRefNum );
  121.     if ( err != noErr ) return err;
  122.  
  123.     err = SetEOF( fRefNum, 0 );
  124.     if ( err != noErr ) goto out;
  125.     
  126.     textSize = *size;
  127.     HLock( (Handle) h );
  128.     err = FSWrite( fRefNum, &textSize, (Ptr) *h );
  129.     HUnlock(  (Handle) h  );
  130.  
  131. out:
  132.     FSClose( fRefNum );
  133.  
  134.     if ( err != noErr ) return err;
  135.  
  136.     *size = textSize;
  137.  
  138.     FlushVol( nil, theFSSpec->vRefNum );
  139.     TouchDir( theFSSpec->vRefNum, theFSSpec->parID );
  140.  
  141.     return noErr;
  142. }
  143.  
  144.  
  145. /***** Get File Information *****/
  146.  
  147. #define    kItsAVolume    1
  148. #define    kItsAFolder    2
  149. #define    kItsAFile        3
  150.  
  151. OSErr GetSpecType ( FSSpec *theFSSpec )
  152. {
  153.     CInfoPBRec    pb;
  154.     OSErr        err;
  155.     short        objType = 0;
  156.     
  157.     if ( (theFSSpec->parID) == fsRtParID )
  158.         objType = kItsAVolume;
  159.     else {
  160.         pb.hFileInfo.ioNamePtr = theFSSpec->name;
  161.         pb.hFileInfo.ioVRefNum = theFSSpec->vRefNum;
  162.         pb.hFileInfo.ioDirID = theFSSpec->parID;
  163.         pb.hFileInfo.ioFDirIndex = 0;
  164.         err = PBGetCatInfoSync( &pb );
  165.         if ( err == noErr ) {
  166.             if ( (pb.hFileInfo.ioFlAttrib & 0x10) != 0 )
  167.                 objType = kItsAFolder;
  168.             else
  169.                 objType = kItsAFile;
  170.         }
  171.     }
  172.     return objType;
  173. }
  174.  
  175. Boolean QueryFile ( FSSpec *theFSSpec, long *fileID )
  176. {
  177. //    long            fileID;
  178.     CInfoPBRec    pb;
  179.     HFileInfo        *fpb = (HFileInfo *) &pb;
  180. //    DirInfo        *dpb = (DirInfo *) &pb;
  181.     OSErr        err;
  182.  
  183.     fpb->ioNamePtr = theFSSpec->name;
  184.     fpb->ioVRefNum = theFSSpec->vRefNum;
  185.     fpb->ioDirID = theFSSpec->parID;
  186.     fpb->ioFDirIndex = 0;
  187.     
  188.     err = PBGetCatInfo( &pb, false );
  189.  
  190.     if ( err != noErr ) return false;    /* the filename does not exist */
  191.  
  192. #ifdef OLDVERSION
  193.     if ( (fpb->ioFlAttrib & 0x10) != 0 )
  194.         return false;                /* but it's a folder */
  195.     else {
  196.         *fileID = fpb->ioDirID;        /* returns its hard file ID */
  197.         return true; }                /* it's a plain file */
  198. #else /* OLDVERSION */
  199.     switch ( GetSpecType( theFSSpec ) ) {
  200.         case kItsAFile:
  201.             *fileID = fpb->ioDirID;
  202.             return true;
  203.         case kItsAVolume:
  204.         case kItsAFolder:
  205.         default:
  206.             break;
  207.     }
  208. #endif /* OLDVERSION */
  209.     return false;
  210. }
  211.  
  212. /***** Finder controls *****/
  213. OSErr TouchDir ( short vRefNum, long dirID )
  214. {
  215.     CInfoPBRec    info;
  216.     Str255        name;
  217.     OSErr        err;
  218.     
  219.     info.dirInfo.ioDrDirID = dirID;
  220.     info.dirInfo.ioVRefNum = vRefNum;
  221.     info.dirInfo.ioNamePtr = name;
  222.     info.dirInfo.ioFDirIndex = -1;
  223.     err = PBGetCatInfo( &info, false );
  224.     if ( !err ) {
  225.         info.dirInfo.ioCompletion = 0;
  226.         info.dirInfo.ioDrDirID = info.dirInfo.ioDrParID;
  227.         info.dirInfo.ioFDirIndex = 0;
  228.         GetDateTime( &info.dirInfo.ioDrMdDat );
  229.         err = PBSetCatInfo( &info, false );
  230.     }
  231.     return err;
  232. }
  233.  
  234.  
  235. /**** Generate a filename *****/
  236. #define MAX_FNAME    31
  237.  
  238. void GenFilename ( StringPtr newFilename, StringPtr oldFilename )
  239. {
  240.     short        c;
  241.     short        i,n;
  242.     
  243.     n = oldFilename[0];
  244.     
  245.     for (i=0;i<=n;++i) newFilename[i] = oldFilename[i];
  246.  
  247. // foooxyz    -> foooox.1
  248.     if ( n >= MAX_FNAME-1 ) {
  249.         newFilename[MAX_FNAME-1] = '.';
  250.         newFilename[MAX_FNAME] = '1';
  251.         newFilename[0] = MAX_FNAME;
  252.         return; }
  253.  
  254. // foo.1    -> foo.2
  255. // foo.a    -> foo.b
  256.     if ( n >= 2 && newFilename[n-1] == '.' ) {
  257.         c = newFilename[n];
  258.         if ( '0' <= c && c < '9' )  newFilename[n] = c+1;
  259.         else if ( c == '9' ) newFilename[n] = 'a';
  260.         else if ( 'a' <= c && c < 'z' ) newFilename[n] = c+1;
  261.         else if ( c == 'z' ) newFilename[n] = 'A';
  262.         else if ( 'A' <= c && c < 'Z' ) newFilename[n] = c+1;
  263.         else if ( c == 'Z' ) newFilename[n] = '0';
  264.         return;
  265.     }
  266.  
  267. // foo    -> foo.1
  268.     if ( n <= MAX_FNAME-2 ) {
  269.         newFilename[n+1] = '.';
  270.         newFilename[n+2] = '1';
  271.         newFilename[0] = n+2;
  272.         return; }        
  273. }
  274.  
  275. #ifdef COMMENT
  276. /***** Do Error Messages *****/
  277. #define    kAlertID        1000
  278. #define    kErrStringID    1000
  279. #define    kNilFilterProc    nil
  280. #define    kMoveToFront    (WindowPtr)-1L
  281.  
  282. static void ErrorMessage ( long err, StringPtr string, Boolean fatal )
  283. {
  284.     short        item;
  285.     Str31    errStr;
  286.     Str255    str = "¥p";
  287.     
  288.     NumToString( err, errStr );
  289.     
  290.     ParamText( "¥pError = ", errStr, "¥p¥r", string );
  291.     
  292.     if ( fatal ) {
  293.         item = StopAlert( kAlertID, kNilFilterProc );
  294.         ExitToShell();
  295.     } else {
  296.         item = NoteAlert( kAlertID, kNilFilterProc );
  297.     if ( item == cancel ) ExitToShell();
  298.     }
  299. }
  300. #endif /*COMMENT */
  301.  
  302. // end of program
  303.